import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;

public class ThreadBlockQueue {
    // 创建一个阻塞时队列
    public static void main(String[] args) throws InterruptedException {
        // 下面是一个标准库提供的阻塞队列
        BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<>(); //基于链表实现的队列 (还有Dequeue 的双线链表);
        //BlockingQueue<String> blockingQueue1 = new ArrayBlockingQueue<>(); // 基于数组实现的队列
        //BlockingQueue<String> blockingQueue2 = new PriorityBlockingQueue<>(); // 带有优先级实现的队列 (优先级队列:基于堆数据结构实现)

        // 这里 我们先看 基于链表实现的队列

        // Queue 提供的方法有三个: 1.入队列.offer  2.出队列.poll  3.取队首元素peek
        // 阻塞队列主要的方法是两个: 1.入队列.put  2.出队列 take (而且这两个操作都是带有阻塞功能的)

        // 插入操作
        blockingQueue.put("hello"); //抛一个带有阻塞的异常
        // 取操作
        String res = blockingQueue.take();
        System.out.println(res);

        // 这时候再来取操作一次
        // 这时后看到第二次打印的操作就没有被取出来,而是陷入了阻塞状态
        res = blockingQueue.take();
        System.out.println(res);

        // BlockingQueue 提供的 offer 和 poll 方法 是不带有阻塞功能的
    }
}
